<?php
/*
*  Класс обеспечивает работу с датами. Преобразование из формата, понятного человеку в формат БД и обратно
*/

//echo 'Date: ' . Service_Date::getCaseDateForUser('2008-05-16 08:59:20',3,1);
/**
 * Класс для работы с датой и временем
 * 
 *Чаще всего используются 2 функции:
 * getTimeForUser возвращает дату и время во временном поясе пользователя, нужно передавать время из бд
 * gLocalTime2BD возвращает настоящее время по гринфичу, для записи в бд
 */
class Service_Date {

	/**
	 * Возвращает время по гринфичу, для записи в бд
	 *
	 * @param unknown_type $localstamp
	 * @return время по гринфичу
	 */
	public static function gLocalTime2BD($localstamp=false){
		if ($localstamp === false) $localstamp = time();
		$tzOffset = date("Z", $localstamp);
		return date("Y-m-d H:i:s", $localstamp - $tzOffset);
	}
	

  /**
   * Функция возвращает дату и время
   *
   * @param str $date
   * @param int $timeZone
   * @return дату и время
   */
  public static function getTimeForUser($date, $timeZone = 3){
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date)+3600*Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);
		$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*Service_Date::summerTime($timeZone));
		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']){
         switch ($arrNow['yday'] - $arrDate['yday']){
          case 0:
            $convDate = "Cегодня";
          break;
          case 1:
            $convDate = "вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday']." ".Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
			$convDate .= " в ". $convTime;
		}
  	else {
  		$convDate = $arrDate['mday']." ".Service_Date::getMonthNameR($arrDate['mon'])." ".$arrDate['year']." г.";
  	}  	  	 	
  	return $convDate;
  }  		
  
  
  
  /**
   * Функция возвращает дату и время в нужном падеже, по умолчанию родительном(падеж задается номером 1-именительный 2-родительный 3-дательном 4-винительный 5-творительный 6-предложный)
   *
   * @param str $date
   * @param int $timeZone
   * @param int $case
   * @return дату и время в нужном падеже
   */
  public static function getCaseDateForUser(str $date, $timeZone = 3, $case = 2){
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date)+3600*Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);
		$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*Service_Date::summerTime($timeZone));
		
		switch ($case){
			case 1: 
				$mothName = Service_Date::getMonthNameI($arrDate['mon']);
			break;
			case 2: 
				$mothName = Service_Date::getMonthNameR($arrDate['mon']);
			break;
			case 3: 
				$mothName = Service_Date::getMonthNameD($arrDate['mon']);
			break;
			case 4: 
				$mothName = Service_Date::getMonthNameV($arrDate['mon']);
			break;
			case 5: 
				$mothName = Service_Date::getMonthNameT($arrDate['mon']);
			break;
			case 6: 
				$mothName = Service_Date::getMonthNameP($arrDate['mon']);
			break;
		}
		
		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']){
        switch ($arrNow['yday'] - $arrDate['yday']){
          case 0:
            $convDate = "Сегодня";
          break;
          case 1:
            $convDate = "Вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday']." ".$mothName;
          break;
			}
		}
  	else {
  		$convDate = $arrDate['mday']." ".$mothName." ".$arrDate['year']." г.";
  	}
  	$convDate .= " в ". $convTime;
  	 	
  	return $convDate;
  }  		
  
  
   /**
   * Функция возвращает только дату
   *
   * @param str $date
   * @param int $timeZone
   * @return только дату
   */
  public static function getDateForUser(str $date, $timeZone = 3){
  	$convDate="";
  	$date = date('Y-m-d H:i:s', strtotime($date)+3600*Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*Service_Date::summerTime($timeZone));
		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']){
        switch ($arrNow['yday'] - $arrDate['yday']){
          case 0:
            $convDate = "Сегодня";
          break;
          case 1:
            $convDate = "Вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday']." ".Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
		}
  	else {
  		$convDate = $arrDate['mday']." ".Service_Date::getMonthNameR($arrDate['mon'])." ".$arrDate['year']." г.";
  	}
  	  	 	
  	return $convDate;
  }  		
  /**
   * Возвращает время временную зону ичитывая летнее и зимнее время
   *
   * @param int $timeZone
   * @return unknown
   */
	public static function summerTime($timeZone){
    static $newTimeZone;
    if(!isset($newTimeZone)){
      $arrTime = localtime(time(),true);
      if ($arrTime['tm_isdst'] == 1)
        $newTimeZone = $timeZone + 1;
      else
        $newTimeZone = $timeZone;
    }
    return $newTimeZone;
  }
	
	
			//Функция возвращает название месяца в именительном падеже
	 public static function getMonthNameI($monthNumber){
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  
  //Функция возвращает название месяца в радительном падеже  
	public static function getMonthNameR($monthNumber){
    switch ($monthNumber) {
    	case 01: return "января";
    	case 02: return "февраля";
    	case 03: return "марта";
    	case 04: return "апреля";
    	case 05: return "мая";
    	case 06: return "июня";
    	case 07: return "июля";
    	case 08: return "августа";
    	case 09:case 9: return "сентября";
    	case 10: return "октября";
    	case 11: return "ноября";
    	case 12: return "декабря";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в дательном падеже
	 public static function getMonthNameD($monthNumber){
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в венительном падеже
	 public static function getMonthNameV($monthNumber){
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в творительном падеже
	 public static function getMonthNameT($monthNumber){
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в предложный падеже
	 public static function getMonthNameP($monthNumber){
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  
  public static function getHTMLYearsSelect($yearStart = 1941, $yearFinish = 2000, $selected = -1, $id = "", $class = "", $name = ""){
    if(!$selected)
      $selected = -1;
    $retText = '<select ';
    if($id != "")
      $retText .= 'id="' . $id . '"';
    if($class != "")
      $retText .= ' class="' . $class . '"';
    if($name != "")
      $retText .= ' name="' . $name . '"';
    $retText .= '>';
    $retText .= '<option value="-1"';
    if ($selected == -1)
      $retText .= ' selected="selected"';
    $retText .= '>--</option>';
    for ($i= $yearStart ; $i <= $yearFinish; $i++){
      $retText .= '<option value="' . $i . '"';
      if ($selected == $i)
        $retText .= ' selected="selected"';
      $retText .= '>' . $i . '</option>';      
    }
    $retText .= '</select>';
    return $retText;
  }    
}
?>